package template_method

// 模版方法 OTP：一次性密码
type iOtp interface {
	genRandomOTP(otpLength int) string
	saveOTPCache(otp string)
	getMessage(otp string) string
	sendNotification(message string) error
	publishMetric()
}

type Otp struct {
	IOtp iOtp
}

// GenAndSendOTP 对外功能，使用泛化后的模板来实现
func (o *Otp) GenAndSendOTP(otpLength int) error {
	otp := o.IOtp.genRandomOTP(otpLength)

	o.IOtp.saveOTPCache(otp)

	message := o.IOtp.getMessage(otp)

	err := o.IOtp.sendNotification(message)
	if err != nil {
		return err
	}

	o.IOtp.publishMetric()

	return nil
}
